const 彩色 = require('./color.js')
const v8 = require('v8')

// 改用递归计算资产负债表
function 计算资产负债表(资产负债表){
    console.log("开始计算资产负债表...")

    资产负债表.资产合计 = 计算子表(资产负债表.资产)
    资产负债表.负债和所有者权益合计 = 计算子表(资产负债表.负债和所有者权益)
    
    if (资产负债表.资产合计 == 资产负债表.负债和所有者权益合计) {
        资产负债表.平衡 = true
    } else {
        资产负债表.平衡 = false
        console.log(`资产负债表不平衡. 资产 - 负债和所有者权益 = ${资产负债表.资产合计 - 资产负债表.负债和所有者权益合计}`)
    }
    console.log(`资产负债表计算完成. 资产共: ${资产负债表.资产合计}, 负债共: ${资产负债表.负债和所有者权益.负债合计}, 所有者权益共: ${资产负债表.负债和所有者权益.所有者权益合计}, 负债和所有者权益共: ${资产负债表.负债和所有者权益合计}.`)    
}

function 计算子表(子表){
    //先计算子表的子表
    for (var 子表键 in 子表){
        if (typeof(子表[子表键]) == 'object'){
            子表[子表键 +'合计'] = 计算子表(子表[子表键])
        }
    }

    //再计算本子表
    var 子表合计 = 0
    for (var 子表键 in 子表){
        if (typeof(子表[子表键]) == 'number'){
            子表合计 += 子表[子表键]
        }
    }
    return 子表合计
}
function 打印资产负债表(资产负债表, 名称) {
    if (typeof(名称) != 'undefined'){
        console.log(彩色.红 + "<<" + 名称 + '>>' + 彩色.还原)
    }
    打印子表(资产负债表, '资产', 0)
    打印子表(资产负债表, '负债和所有者权益', 0)
}

function 打印子表(父表, 子表名, 级别){
    var 前缀 = 级别前缀(级别) 
    var 子项前缀 = 级别前缀(级别 + 1) 
    console.log(前缀 + 彩色.青 + 子表名 + 彩色.还原 + '(' + 彩色.黄 + 父表[子表名 + '合计'] + 彩色.还原 + ')')
    var 子表 = 父表[子表名]
    for(var 子表键 in 子表){
        if(typeof(子表[子表键]) == 'number' && 子表键.search('合计') < 0){ // 打印所有不是合计的子表值
            console.log(子项前缀 + 子表键 + '(' + 彩色.黄 + 子表[子表键] + 彩色.还原 + ')')
        }
    }

    for(var 子表键 in 子表){
        if(typeof(子表[子表键]) == 'object'){ // 递归打印子表中的子表
            打印子表(子表, 子表键, 级别 + 1)
        }
    }

}

function 级别前缀(级别){
    var 前缀 = ''
    if (级别 >= 1){
        前缀 = '┣'
    }
    for(i = 1; i < 级别; i++){
        前缀 = "┃" + 前缀
    }
    return 前缀
}

function 计算利润表(利润表, 期初资产负债表, 期末资产负债表){
    利润表.期初存货 = typeof(期初资产负债表.资产.流动资产) == 'undefined'? 期初资产负债表.资产.存货合计 : 期初资产负债表.资产.流动资产.存货合计
    利润表.可供出售的商品 = 利润表.期初存货 + 
        (typeof(利润表.原料采购) == 'undefined' ? 0 : 利润表.原料采购) + 
        (typeof(利润表.人工成本) == 'undefined' ? 0 : 利润表.人工成本) 
    利润表.期末存货 = typeof(期末资产负债表.资产.流动资产) == 'undefined'? 期末资产负债表.资产.存货合计: 期末资产负债表.资产.流动资产.存货合计
    利润表.商品销售成本 = 利润表.可供出售的商品 - 利润表.期末存货
    利润表.毛利 = 利润表.销售收入 - 利润表.商品销售成本
    利润表.总费用 = 0
    for(var 费用项 in 利润表.费用){
        利润表.总费用 += 利润表.费用[费用项]
    }
    利润表.税前利润 = 利润表.毛利 - 利润表.总费用
    if(typeof(利润表.所得税) != 'undefined'){
        利润表.净利润 = 利润表.税前利润 - 利润表.所得税
    }
}

function 计算现金流量表(表){
    console.log(表)
    表.期末现金 = 表.期初现金 + 表.现金流入 - 表.现金购置存货 - 表.固定资产投资 - 表.现金支付费用 - (typeof(表.归还银行贷款本金) == 'undefined'? 0: 表.归还银行贷款本金)
    表.现金流量净额 = 表.现金流入 - 表.现金购置存货 - 表.固定资产投资 - 表.现金支付费用 - (typeof(表.归还银行贷款本金) == 'undefined'? 0: 表.归还银行贷款本金)
}

function cloneObj(obj){
    // return JSON.parse(JSON.stringify(obj))
    return v8.deserialize(v8.serialize(obj))
}

function 滚存资产负债表(期末表){
    console.log('开始滚存上一期末资产负债表至本期期初...')
    var 新表 = cloneObj(期末表)
    新表.所有者权益.留存收益 += 新表.所有者权益.本周盈利
    新表.所有者权益.本周盈利 = 0
    计算资产负债表(新表) 
    return 新表
}

function main() {
    彩色.打印标题(`   第一章: 资产负债表    `)
    var 资产负债表 = {
        资产: {},
        资产合计: 0,
        负债和所有者权益: {
            负债: {},
            负债合计: 0,
            所有者权益: {},
            所有者权益合计: 0,
        },
        负债和所有者权益合计: 0,
        平衡: true,
    }
    // 简化书写方式
    资产负债表.负债 = 资产负债表.负债和所有者权益.负债
    资产负债表.所有者权益 = 资产负债表.负债和所有者权益.所有者权益
    console.log("会计法则: 资产 == 负债 + 所有者权益")

    彩色.打印事件("找柠檬摊位投资, 自己有5美元, 初始投资和现金增加")
    资产负债表.资产.现金 = 5.0
    资产负债表.所有者权益.初始投资 = 5.0
    计算资产负债表(资产负债表)

    彩色.打印事件("找爸妈借了10美元, 应该还的钱(应付票据)和现金增加")
    资产负债表.资产.现金 += 10
    资产负债表.负债.应付票据 = 10
    计算资产负债表(资产负债表)

    彩色.打印事件("花了12美元买原材料(存货), 包括50个柠檬和5磅白糖")
    资产负债表.资产.现金 -= 12
    资产负债表.资产.存货 = 12.0
    计算资产负债表(资产负债表)

    彩色.打印事件(`50个柠檬和5磅白糖和2加仑水生产60杯柠檬汁, 一杯成本20美分, 售价50美分, 销售了50杯, 销售额25美元`)
    资产负债表.资产.现金 += 0.5 * 50
    资产负债表.资产.存货 -= 0.2 * 50
    资产负债表.所有者权益.本周盈利 = (0.5 - 0.2) * 50
    计算资产负债表(资产负债表)

    彩色.打印事件("花2美元租玻璃杯，1美元做广告，另外2美元租场地。产生5美元费用")
    资产负债表.资产.现金 -= 2 + 1 + 2
    资产负债表.所有者权益.本周盈利 -= 2 + 1 + 2
    计算资产负债表(资产负债表)

    彩色.打印事件("给爸妈还钱10美元")
    资产负债表.资产.现金 -= 10
    资产负债表.负债.应付票据 -= 10
    计算资产负债表(资产负债表)

    打印资产负债表(资产负债表)

    彩色.打印标题(`   第2章: 利润表   `)
    console.log("会计法则: 销售收入 - 销售成本 = 毛利")
    console.log("会计法则: 毛利 - 费用 = 净利(纯利/收益/底线值)")

    var 利润表 = {
        起始时间: "星期一上午",
        截止时间: "星期天下午",
    }
    //利润表记录动态变化的过程, 故而使用赋值.
    利润表.销售收入 = 0.5 * 50
    利润表.期初存货 = 0
    利润表.原料采购 = {
        糖: 2.0,
        柠檬: 10.0,
    }
    利润表.可供出售的商品 = 0.2 * 60 // 60杯柠檬汁
    利润表.期末存货 = 0.2 * (60 - 50) //卖出50杯
    利润表.商品销售成本 =
        利润表.期初存货 + 利润表.可供出售的商品 - 利润表.期末存货
    利润表.毛利 = 利润表.销售收入 - 利润表.商品销售成本
    利润表.费用 = {
        玻璃杯租金: 2.0,
        广告费: 1.0,
        场地租金: 2.0,
    }
    利润表.总费用 =
        利润表.费用.玻璃杯租金 + 利润表.费用.广告费 + 利润表.费用.场地租金
    利润表.净利 = 利润表.销售收入 - 利润表.毛利
    console.log("利润表", 利润表)
    console.log(
        `资产负债表.所有者权益.本周盈利 == 利润表.净利 == ${利润表.净利}`
    )
    console.log(`资产负债表.资产.存货 == 利润表.期末存货 == ${利润表.期末存货}`)

    var 第一周期末资产负债表 = 资产负债表

    彩色.打印事件('第一周结束了.')
    第一周期末资产负债表.所有者权益.留存收益 = 0
    打印资产负债表(第一周期末资产负债表, "第一周期末资产负债表")

    彩色.打印标题(`       第三章: 留存收益、贷款、赊账、应付账款、应付票据     `)
    彩色.打印事件('第二周开始了. 将盈利转留存收益')
    var 第二周期初资产负债表 = cloneObj(第一周期末资产负债表)
    第二周期初资产负债表.所有者权益.留存收益 += 第二周期初资产负债表.所有者权益.本周盈利
    第二周期初资产负债表.所有者权益.本周盈利 = 0
    计算资产负债表(第二周期初资产负债表)
    打印资产负债表(第二周期初资产负债表, '第二周期初资产负债表')

    var 第二周期末资产负债表 = cloneObj(第二周期初资产负债表)
    第二周利润表 = {
        起始时间 : '第二周星期一上午',
        截止时间 : '第二周星期天下午'
    }
    彩色.打印事件('向银行借款50美元')
    第二周期末资产负债表.负债.应付票据 += 50
    第二周期末资产负债表.资产.现金 += 50
    计算资产负债表(第二周期末资产负债表)

    彩色.打印事件('朋友以成本价买了所有2美元存货')
    第二周期末资产负债表.资产.存货 -= 2
    第二周期末资产负债表.资产.现金 += 2
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.销售收入 = 2
    第二周利润表.期初存货 = 2

    彩色.打印事件('杂货店老板赊了4美元白糖, 新增应付账款项')
    第二周期末资产负债表.资产.存货 += 4
    第二周期末资产负债表.负债.应付账款 = 4
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.原料采购 = {白糖: 4}

    
    彩色.打印事件('以20美分购入100个柠檬')
    第二周期末资产负债表.资产.现金 -= 0.2 * 100
    第二周期末资产负债表.资产.存货 += 0.2 * 100
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.原料采购.柠檬 = 0.2 * 100

    打印资产负债表(第二周期末资产负债表, '第二周期末资产负债表')

    彩色.打印标题('      第4章　应付工资、应收账款、坏账、利息、待摊费用、权责发生制、收付实现制、创意会计    ')

    彩色.打印事件('雇佣姐姐制作60杯柠檬汁, 工资1美元, 将存货分为原材料和产成品')
    第二周期末资产负债表.资产.存货合计 = 第二周期末资产负债表.资产.存货
    第二周期末资产负债表.资产.存货 = {
        原材料: 第二周期末资产负债表.资产.存货合计 - 0.2 * 60,
        产成品: 0.2 * 60 + 1
    }
    第二周期末资产负债表.资产.现金 -= 1
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.人工成本 = 1
    第二周利润表.可供出售的商品 = 第二周利润表.期初存货 + 第二周利润表.原料采购.白糖 + 第二周利润表.原料采购.柠檬 + 第二周利润表.人工成本

    彩色.打印事件('卖出所有60杯柠檬汁(产成品), 其中40杯付现, 20杯是小伙伴赊账购买')
    第二周期末资产负债表.资产.现金 += 40 * 0.5
    第二周期末资产负债表.资产.应收账款 = 20 * 0.5
    第二周期末资产负债表.资产.存货.产成品 -= 13  //全部13元产成品卖出
    第二周期末资产负债表.所有者权益.本周盈利 += 60 * 0.5 - 13
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.销售收入 += 60 * 0.5
    第二周利润表.期末存货 = 第二周期末资产负债表.资产.存货合计
    第二周利润表.商品销售成本 = 第二周利润表.可供出售的商品 - 第二周利润表.期末存货
    第二周利润表.毛利 = 第二周利润表.销售收入 - 第二周利润表.商品销售成本
    
    彩色.打印事件('一个赊账买了8杯的小伙伴搬家了, 产生4美元坏账')
    第二周期末资产负债表.资产.应收账款 -= 8 * 0.5
    第二周期末资产负债表.所有者权益.本周盈利 -= 8 * 0.5
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.费用 = {坏账: 8 * 0.5}

    彩色.打印事件('向银行偿还1/2的借款25美元, 并付2美元利息')
    第二周期末资产负债表.资产.现金 -= 25 + 2
    第二周期末资产负债表.所有者权益.本周盈利 -= 2
    第二周期末资产负债表.负债.应付票据 -= 25
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.费用.利息 = 2

    彩色.打印事件('购买3美元保险, 保期3年, 产生待摊费用')
    第二周期末资产负债表.资产.现金 -= 3
    第二周期末资产负债表.资产.待摊费用 = 3
    计算资产负债表(第二周期末资产负债表)

    彩色.打印事件('第一年的1美元保险为当期费用, 视为已消耗, 故待摊费用减去1美元, 并且盈利减去1美元')
    第二周期末资产负债表.资产.待摊费用 -= 1
    第二周期末资产负债表.所有者权益.本周盈利 -= 1
    计算资产负债表(第二周期末资产负债表)
    第二周利润表.费用.保险费 = 1

    彩色.打印事件('这样立即对交易(合同)核算而不是收款付款时才核算的叫权责发生制(应收应付制), 与之相对的在收付款时才核算的是收付实现制')

    打印资产负债表(第二周期末资产负债表, '第二周期末资产负债表')

    彩色.打印事件('编制剩余的第二周利润表')
    第二周利润表.总费用 = 第二周利润表.费用.坏账 + 第二周利润表.费用.利息 + 第二周利润表.费用.保险费
    第二周利润表.税前利润 = 第二周利润表.毛利 - 第二周利润表.总费用
    console.log(第二周利润表)

    彩色.打印事件('编制基于收付实现制的第二周利润表')
    收付实现制第二周利润表 = {
        起始时间: '第二周星期一上午',
        截止时间: '第二周星期天下午',
        销售收入: 22,
        期初存货: 0,
        原料采购: 20,
        人工成本: 1
    }
    收付实现制第二周利润表.可供出售的商品 = 收付实现制第二周利润表.期初存货 + 收付实现制第二周利润表.原料采购 + 收付实现制第二周利润表.人工成本
    收付实现制第二周利润表.期末存货 = 0
    收付实现制第二周利润表.商品销售成本 = 收付实现制第二周利润表.可供出售的商品 -  收付实现制第二周利润表.期末存货
    收付实现制第二周利润表.毛利 =  收付实现制第二周利润表.销售收入 -  收付实现制第二周利润表.可供出售的商品
    收付实现制第二周利润表.费用 = {
        利息: 2,
        保险费: 3
    }
    收付实现制第二周利润表.总费用 = 收付实现制第二周利润表.费用.利息 + 收付实现制第二周利润表.费用.保险费
    收付实现制第二周利润表.净利润 = 收付实现制第二周利润表.毛利 - 收付实现制第二周利润表.总费用
    console.log(收付实现制第二周利润表)

    彩色.打印事件('创意会计: 对于无存货的服务类行业, 采用收付实现制交税, 可以延期交税/权责发生制给投资人看, 可以更好看到利润')

    彩色.打印标题('    第5章　服务业    ')
    服务业利润表 = {}

    彩色.打印事件('平行宇宙: 数月后开办柠檬汁咨询公司, 迈克和休阿姨签订合同, 出售给休阿姨3天 * 2个咨询师 * 8美元的咨询服务')
    服务业利润表.营业收入 = 3 * 2 * 8

    彩色.打印事件('支出2个咨询师 * 2美元 * 3天的报酬, 6美元差旅费')
    服务业利润表.服务成本 = 6 + (2 * 2 * 3)

    彩色.打印事件('咨询师咨询时消耗2美元柠檬和1美元白糖')
    服务业利润表.服务成本 += 2 + 1

    彩色.打印事件('支出4美元广告费')
    服务业利润表.费用 = {营业及市场费用: 4}

    彩色.打印事件('1美元给迈克的合同销售佣金, 销售佣金可以计入服务成本或者市场费用, 这儿计入费用')
    服务业利润表.费用.营业及市场费用 += 1

    彩色.打印事件('2个外勤咨询师周五开发咨询课程, 每人1.5美元')
    服务业利润表.费用.研发费 = 2 * 1.5

    彩色.打印事件('2美元给迈克的行政管理工资, 另两个没有外勤的咨询师周五工作, 每人1.5美元工资')
    服务业利润表.费用.管理费用 = 2 + 2 * 1.5
    服务业利润表.总费用 = 服务业利润表.费用.营业及市场费用 + 服务业利润表.费用.研发费 + 服务业利润表.费用.管理费用
    服务业利润表.毛利 = 服务业利润表.营业收入 - 服务业利润表.服务成本
    服务业利润表.净利润 = 服务业利润表.毛利 - 服务业利润表.总费用
    console.log("\n服务业利润表\n", 服务业利润表)

    彩色.打印标题('    第6章　先进先出法、后进先出法    ')

    var 第三周期初资产负债表 = 滚存资产负债表(第二周期末资产负债表)
    打印资产负债表(第三周期初资产负债表, '第三周期初资产负债表')

    var 第三周期末资产负债表 = cloneObj(第三周期初资产负债表)
    
    彩色.打印事件('柠檬涨价一倍到0.4每个, 杂货店老板答应赊账20美元购买50个.')
    第三周期末资产负债表.资产.存货.原材料 += 20
    第三周期末资产负债表.负债.应付账款 += 20
    计算资产负债表(第三周期末资产负债表)

    彩色.打印事件('柠檬前后价格不一致, 采用先进先出法FIFO编制资产负债表, 用最先的10美元50个柠檬+2美元5磅白糖制作柠檬汁60杯')
    第三周期末资产负债表.资产.存货.原材料 -= 10 + 2
    第三周期末资产负债表.资产.存货.产成品 += 10 + 2
    计算资产负债表(第三周期末资产负债表)

    彩色.打印事件('60杯柠檬汁全卖, 0.5 * 50 付现, 0.5 * 10 赊销')
    第三周期末资产负债表.资产.现金 += 0.5 * 50
    第三周期末资产负债表.资产.应收账款 += 0.5 * 10
    第三周期末资产负债表.所有者权益.本周盈利 += 0.5 * 60 - 第三周期末资产负债表.资产.存货.产成品
    第三周期末资产负债表.资产.存货.产成品 -= 第三周期末资产负债表.资产.存货.产成品
    计算资产负债表(第三周期末资产负债表)

    打印资产负债表(第三周期末资产负债表, '第三周期末资产负债表')

    彩色.打印事件('编制第三周先进先出FIFO利润表')
    第三周FIFO利润表 = {
        起始时间:'第三周星期一上午',
        截止时间: '第三周星期天下午',
        销售收入: 0.5 * 60,
        原料采购: 20,
        人工成本: 0,
        费用: {}
    }
    计算利润表(第三周FIFO利润表, 第三周期初资产负债表, 第三周期末资产负债表)
    console.log(第三周FIFO利润表)

    彩色.打印事件('编制第三周后进先出LIFO资产负债表, 使用0.4的柠檬50个(20元)而不是0.2的')
    var 第三周LIFO期末资产负债表 = cloneObj(第三周期初资产负债表)
    第三周LIFO期末资产负债表.资产.存货.原材料 += 20
    第三周LIFO期末资产负债表.负债.应付账款 += 20    
    第三周LIFO期末资产负债表.资产.存货.原材料 -= 20 + 2
    第三周LIFO期末资产负债表.资产.存货.产成品 += 20 + 2
    第三周LIFO期末资产负债表.资产.现金 += 0.5 * 50
    第三周LIFO期末资产负债表.资产.应收账款 += 0.5 * 10
    第三周LIFO期末资产负债表.所有者权益.本周盈利 += 0.5 * 60 - 第三周LIFO期末资产负债表.资产.存货.产成品
    第三周LIFO期末资产负债表.资产.存货.产成品 -= 第三周LIFO期末资产负债表.资产.存货.产成品
    计算资产负债表(第三周LIFO期末资产负债表)

    打印资产负债表(第三周LIFO期末资产负债表, '第三周LIFO期末资产负债表')

    彩色.打印事件('编制第三周后进先出LIFO利润表')
    第三周LIFO利润表 = {
        起始时间:'第三周星期一上午',
        截止时间: '第三周星期天下午',
        销售收入: 0.5 * 60,
        原料采购: 20,
        人工成本: 0,
        费用: {}
    }
    计算利润表(第三周LIFO利润表, 第三周期初资产负债表, 第三周LIFO期末资产负债表)
    console.log(第三周LIFO利润表)

    彩色.打印事件('先进先出和后进先出的唯一区别就是节税, 除此之外还有加权平均法和个别计价法(每个存货都有编号)')

    彩色.打印标题('    第7章　现金流量表、固定资产、资本化、折旧    ')

    彩色.打印事件('第四周开始了, 这一周开始坚持采用后进先出法对存货计价')
    var 第四周期初资产负债表 = 滚存资产负债表(第三周LIFO期末资产负债表)
    打印资产负债表(第四周期初资产负债表, '第四周期初资产负债表')
    var 第四周期末资产负债表 = cloneObj(第四周期初资产负债表)

    var 第四周利润表 = {
        起始时间: '第四周星期一上午',
        截止时间: '第四周星期天下午'
    }

    彩色.打印事件('赊账小伙伴还钱5美元')
    第四周期末资产负债表.资产.应收账款 -= 5
    第四周期末资产负债表.资产.现金 += 5
    计算资产负债表(第四周期末资产负债表)

    彩色.打印事件('赊账小伙伴还钱无法在利润表中体现, 故开始编制现金流量表')
    第四周现金流量表 = {
        现金流入: 5,
        现金购置存货: 0,
        固定资产投资: 0,
        现金支付费用: 0,
        现金流量净额: 5,
        期初现金: 第四周期初资产负债表.资产.现金,
        期末现金: 0
    }

    彩色.打印事件('8美元新买柠檬摊, 2美元购买土地, 增加固定资产, 将此项加入资产负债表的资产中, 称之为资产的资本化. 另外如果放在费用中则是费用化. 如果资本化, 则不影响利润表.')
    第四周期末资产负债表.资产.固定资产 = 8 + 2
    第四周期末资产负债表.资产.现金 -= 8 + 2
    计算资产负债表(第四周期末资产负债表)
    第四周现金流量表.固定资产投资 = 8 + 2

    彩色.打印事件('2美元购入油漆并粉刷, 可资产化(长期使用)或者费用化(短期使用, 如一年内), 这儿进行费用化,将使本周盈利为负,即赤字. 费用化则影响利润表')
    第四周期末资产负债表.资产.现金 -= 2
    第四周期末资产负债表.所有者权益.本周盈利 -= 2
    计算资产负债表(第四周期末资产负债表)
    第四周现金流量表.现金支付费用 = 2
    第四周利润表.费用 = {油漆粉刷: 2}

    彩色.打印事件('赊账2美元购买洗涤槽, 属于固定资产')
    第四周期末资产负债表.负债.应付账款 += 2
    第四周期末资产负债表.资产.固定资产 += 2
    计算资产负债表(第四周期末资产负债表)

    彩色.打印事件('赊账1美元维修顶棚, 属于维修费用')
    第四周期末资产负债表.负债.应付账款 += 1
    第四周期末资产负债表.所有者权益.本周盈利 -= 1
    计算资产负债表(第四周期末资产负债表)
    第四周利润表.费用.维修费用 = 1

    彩色.打印事件('现金20美元购买100杯预制柠檬汁')
    第四周期末资产负债表.资产.现金 -= 20
    第四周期末资产负债表.资产.存货.产成品 += 20
    计算资产负债表(第四周期末资产负债表)
    第四周现金流量表.现金购置存货 = 20
    第四周利润表.原料采购 = 20

    彩色.打印事件('销售所有20美元柠檬汁, 获取40美元现金和10美元应收账款')
    第四周期末资产负债表.资产.现金 += 40
    第四周期末资产负债表.资产.应收账款 += 10
    第四周期末资产负债表.资产.存货.产成品 -= 20
    第四周期末资产负债表.所有者权益.本周盈利 += 40 + 10 - 20
    计算资产负债表(第四周期末资产负债表)
    第四周现金流量表.现金流入 += 40
    第四周利润表.销售收入 = 40 + 10

    彩色.打印事件('归还杂货店4美元欠款, 不影响利润表')
    第四周期末资产负债表.资产.现金 -= 4
    第四周期末资产负债表.负债.应付账款 -= 4
    计算资产负债表(第四周期末资产负债表)
    第四周现金流量表.现金购置存货 += 4
    
    彩色.打印事件('归还银行25美元欠款和2美元利息, 利息作为费用会影响利润表')
    第四周期末资产负债表.资产.现金 -= 25 + 2
    第四周期末资产负债表.负债.应付票据 -= 25
    第四周期末资产负债表.所有者权益.本周盈利 -= 2
    计算资产负债表(第四周期末资产负债表)
    第四周现金流量表.归还银行贷款本金 = 25
    第四周现金流量表.现金支付费用 += 2
    第四周利润表.费用.利息 = 2

    彩色.打印事件('柠檬摊10美元(8美元购置+2美元洗涤槽)按10年折旧, 依照直线折旧法, 今年折旧1美元')
    第四周期末资产负债表.资产.固定资产 -= 1
    第四周期末资产负债表.所有者权益.本周盈利 -= 1
    计算资产负债表(第四周期末资产负债表)
    第四周利润表.费用.折旧费 = 1

    打印资产负债表(第四周期末资产负债表, '第四周期末资产负债表')

    计算利润表(第四周利润表, 第四周期初资产负债表, 第四周期末资产负债表)
    console.log('第四周利润表', 第四周利润表)
    
    计算现金流量表(第四周现金流量表)
    console.log('第四周现金流量表', 第四周现金流量表)

    彩色.打印标题('    第8章　利润vs现金    ')

    彩色.打印事件('第五周开始了.')
    var 第五周期初资产负债表 = 滚存资产负债表(第四周期末资产负债表)
    打印资产负债表(第五周期初资产负债表, '第五周期初资产负债表')
    var 第五周期末资产负债表 = cloneObj(第五周期初资产负债表)
    var 第五周利润表 = {
        '起始时间': '第五周星期一上午',
        '截止时间': '第五周星期天下午',
        '期初存货': 第五周期初资产负债表.资产.存货合计
    }
    var 第五周现金流量表 = {期初现金: 第五周期初资产负债表.资产.现金}

    彩色.打印事件('20美元购买旅行车, 作为设备类可移动的固定资产, 需要和以前的不可移动的固定资产区分. 不可移动的柠檬摊附属于土地, 与土地共同归为建筑物, 其中又只有10美元的柠檬摊是可以折旧的')
    第五周期末资产负债表.资产.现金 -= 20
    var 建筑物 = 第五周期末资产负债表.资产.固定资产
    第五周期末资产负债表.资产.固定资产 = {
        建筑物: 建筑物,
        设备: 20
    }
    计算资产负债表(第五周期末资产负债表)
    第五周现金流量表.固定资产投资 = 20

    彩色.打印事件('30美元采购柠檬汁, 21美元付现, 9元赊账. 现金花完了, 盈利不能当现金使用! 只有现金而不是利润才能维持企业经营!')
    第五周期末资产负债表.资产.现金 -= 21
    第五周期末资产负债表.资产.存货.产成品 += 30
    第五周期末资产负债表.负债.应付账款 += 9
    计算资产负债表(第五周期末资产负债表)
    第五周利润表.原料采购 = 30
    第五周现金流量表.现金购置存货 = 21


    彩色.打印事件('销售出去所有30美元柠檬汁, 赚取50美元现金')
    第五周期末资产负债表.资产.现金 += 50
    第五周期末资产负债表.资产.存货.产成品 -= 30
    第五周期末资产负债表.所有者权益.本周盈利 += 50 - 30
    计算资产负债表(第五周期末资产负债表)
    第五周利润表.销售收入 = 50
    第五周现金流量表.现金流入 = 50

    彩色.打印事件('给自己发4美元工资')
    第五周期末资产负债表.资产.现金 -= 4
    第五周期末资产负债表.所有者权益.本周盈利 -= 4
    计算资产负债表(第五周期末资产负债表)
    第五周利润表.费用 = {工资: 4}
    第五周现金流量表.现金支付费用 = 4

    彩色.打印事件('使用双倍余额递减法对设备进行折旧(按10年计), 每年基于残值折旧, 折旧率为直线法的2倍. 这在前期账面减少盈利并减少所得税. 公式: 年折旧率=2÷预计的折旧年限×100%，年折旧额=固定资产期初折余价值×年折旧率。最后两年，每年折旧额=(固定资产原值-累计折旧-残值)/2. 这种加速成本回收制度简称ACRS, 修订版为MACRS')
    var 设备折旧 = 第五周期末资产负债表.资产.固定资产.设备 * (2 / 10)
    第五周期末资产负债表.资产.固定资产.设备 -= 设备折旧
    第五周期末资产负债表.所有者权益.本周盈利 -= 设备折旧
    计算资产负债表(第五周期末资产负债表)
    第五周利润表.费用.设备折旧 = 设备折旧

    彩色.打印事件('为本周盈利交税25%, 税金作为负债而不是费用.')
    var 税 = 第五周期末资产负债表.所有者权益.本周盈利 * 0.25
    第五周期末资产负债表.所有者权益.本周盈利 -= 税
    第五周期末资产负债表.负债.应交税金 = 税
    计算资产负债表(第五周期末资产负债表)
    第五周利润表.所得税 = 税

    彩色.打印事件('为说明流动资产和固定资产原值/折扣/净值概念, 新建一个资产负债表, 将现金、应收账款、存货及待摊费用合入流动资产, 流动资产是指一年内可以变现的资产, 并在资产负债表中显示固定资产原值,折旧和净值')
    var 流动和折旧资产负债表 = cloneObj(第五周期末资产负债表)
    var 流动资产 = {
        现金: 第五周期末资产负债表.资产.现金,
        应收账款: 第五周期末资产负债表.资产.应收账款,
        存货: 第五周期末资产负债表.资产.存货,
        待摊费用: 第五周期末资产负债表.资产.待摊费用
    }
    delete 流动和折旧资产负债表.资产.现金
    delete 流动和折旧资产负债表.资产.应收账款
    delete 流动和折旧资产负债表.资产.存货
    delete 流动和折旧资产负债表.资产.待摊费用
    delete 流动和折旧资产负债表.资产.存货合计
    流动和折旧资产负债表.资产.流动资产 = 流动资产
    流动和折旧资产负债表.资产.固定资产.设备 = {
        原值: 20,
        折旧: -4
    }
    流动和折旧资产负债表.资产.固定资产.建筑物 = {
        原值: 12,
        折旧: -1
    }
    计算资产负债表(流动和折旧资产负债表)
    打印资产负债表(流动和折旧资产负债表, '流动和折旧资产负债表')
    
    打印资产负债表(第五周期末资产负债表, '第五周期末资产负债表')

    计算利润表(第五周利润表, 第五周期初资产负债表, 第五周期末资产负债表)
    console.log('第五周利润表', 第五周利润表)

    彩色.打印事件('编制现金流量表')
    计算现金流量表(第五周现金流量表)
    console.log('第五周现金流量表', 第五周现金流量表)
    
    彩色.打印标题('  第9章　税金、清算    ')

    彩色.打印事件('以流动和折旧资产负债表作为开始税金清算资产负债表.')
    var 税金清算资产负债表 = cloneObj(流动和折旧资产负债表)

    彩色.打印事件('本周盈利已经交过税, 再为留存收益交税25%')
    税 = 税金清算资产负债表.所有者权益.留存收益 * 0.25
    税金清算资产负债表.负债.应交税金 += 税
    税金清算资产负债表.所有者权益.留存收益 -= 税
    计算资产负债表(税金清算资产负债表)

    彩色.打印事件('扔掉坏了的柠檬, 原材料-10. 使用 先入先在FISH 存货计价方法, 对柠檬核销, 并且重新计算税金')
    税 = 税金清算资产负债表.所有者权益.本周盈利 * ( 1 / (1 - 0.25) - 1)
    税金清算资产负债表.负债.应交税金 -= 税    //退回本周盈利的税
    税金清算资产负债表.所有者权益.本周盈利 += 税
    税金清算资产负债表.所有者权益.本周盈利 -= 税金清算资产负债表.资产.流动资产.存货.原材料 //核销报废原料重新扣税
    税 = 税金清算资产负债表.所有者权益.本周盈利 * 0.25 //为本周盈利交税
    税金清算资产负债表.负债.应交税金 += 税
    税金清算资产负债表.所有者权益.本周盈利 -= 税
    税金清算资产负债表.资产.流动资产.存货.原材料 -= 税金清算资产负债表.资产.流动资产.存货.原材料 //扣除原材料
    计算资产负债表(税金清算资产负债表)
    
    彩色.打印事件('利润表核销坏柠檬, 并交税')
    税金清算利润表 = cloneObj(第五周利润表)
    计算利润表(税金清算利润表, 第五周期初资产负债表, 税金清算资产负债表)

    console.log('税金清算利润表', 税金清算利润表)

    彩色.打印事件('付清供应商欠款32美元, 支付所得税(原文是14美元, 但核销坏柠檬之后应该是13.5美元), 取消保险收回2美元(最早应该说过这个三年一保收不回的?), 收回应收账款(原文中翻译有点儿问题, 应该是收回了的)')
    税金清算资产负债表.资产.流动资产.现金 -= 税金清算资产负债表.负债.应付账款 + 税金清算资产负债表.负债.应交税金
    税金清算资产负债表.负债.应付账款 -= 税金清算资产负债表.负债.应付账款
    税金清算资产负债表.负债.应交税金 -= 税金清算资产负债表.负债.应交税金
    税金清算资产负债表.资产.流动资产.现金 += 税金清算资产负债表.资产.流动资产.待摊费用
    税金清算资产负债表.资产.流动资产.待摊费用 -= 税金清算资产负债表.资产.流动资产.待摊费用
    税金清算资产负债表.资产.流动资产.现金 += 税金清算资产负债表.资产.流动资产.应收账款
    税金清算资产负债表.资产.流动资产.应收账款 -= 税金清算资产负债表.资产.流动资产.应收账款
    计算资产负债表(税金清算资产负债表)

    打印资产负债表(税金清算资产负债表, '税金清算资产负债表')

    彩色.打印事件('将各周利润表合并为累积利润表(TBD)')

    彩色.打印标题('    第10章　最后分析——增加利润    ')

    console.log(`这一章是纯分析. 其实是最重要的一章了.
    * 三大比率: 成本收入比, 费用收入比, 净利率, 应该与行业均值比较, 并且与自身过往比较(趋势分析);
    * 固定资产的投资最终可能很难收回, 因为固定资产(尤其是设备)都不大好卖的, 因此固定资产应该慎重投资, 应评估固定资产投入后能带来多少产出, 利润是否能很快覆盖并超出固定资产;
    * 对于供应链管理, 先进先出, 减少存货库存周期及其重要. 库存长期积压, 无论对于保质期长短的存货都不是好事, 长期积压最后会直接导致资产减值;
    * 应减少坏账, 评估客户和渠道的偿债能力, 坏账将直接导致利润减值;
    * 现金流及其重要, 更甚于利润. 一个盈利良好的企业现金流一旦中断, 企业连一天都不能维持.
    * 利润存在于账面上, 是很容易流失的;
    * 提高利润其实就是老生常谈的开源节流,降本增效. 但开源和节流是矛盾的, 降低成本和费用也有可能导致销量下降(广告曝光不足/品质下降等), 而开发新产品新功能一定是会提高成本的.
    `)
}

main()
